分割字符串的方案数
给你一个二进制串 s (一个只包含 0 和 1 的字符串),我们可以将 s 分割成 3 个 非空 字符串 s1, s2, s3 (s1 + s2 + s3 = s)。
请你返回分割 s 的方案数,满足 s1,s2 和 s3 中字符 ‘1’ 的数目相同。
由于答案可能很大,请将它对 10^9 + 7 取余后返回。
示例 1:
1 2 3 4 5 6 7
| 输入:s = "10101" 输出:4 解释:总共有 4 种方法将 s 分割成含有 '1' 数目相同的三个子字符串。 "1|010|1" "1|01|01" "10|10|1" "10|1|01"
|
示例 2:
示例 3:
1 2 3 4 5 6
| 输入:s = "0000" 输出:3 解释:总共有 3 种分割 s 的方法。 "0|0|00" "0|00|0" "00|0|0"
|
示例 4:
1 2
| 输入:s = "100100010100110" 输出:12
|
提示:
- s[i] == ‘0’ 或者 s[i] == ‘1’
- 3 <= s.length <= 10^5
代码:
50%,53%
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| class Solution { public: using ll = long long ; int numWays(string s) { ll cnt = 0; int mod = 1e9 + 7; ll n = s.size(); for(char c : s) cnt += (c == '1'); if(!cnt){ return ((n - 1) % mod * (n - 2) % mod) / 2; } if( cnt % 3) return 0; ll idx = cnt / 3; ll tmp = 0; ll ans = 1; for(int i = 0; i < s.size(); i++){ tmp += (s[i] == '1'); if(s[i] == '0') continue; if(tmp % idx == 0){ int j = i + 1; while (j < n && s[j] == '0') j++; ans = (ans * (j - i)) % mod; } if(tmp == idx * 2) break; } return ans % mod; } };
|